package com.krisyu.builderPattern.example;

import com.krisyu.builderPattern.example.builder.BWMCarBuilder;
import com.krisyu.builderPattern.example.builder.BenzCarBuilder;
import com.krisyu.builderPattern.example.product.BWMCar;
import com.krisyu.builderPattern.example.product.BenzCar;
import com.krisyu.builderPattern.example.product.CarModel;

import java.util.ArrayList;
import java.util.List;

/**
 * @author KrisYu
 * @date 2022/12/17
 * @description
 */
public class Client {
    public static void main(String[] args) {
//        client1();
        client2();
    }

    /**
     * 场景一：没有使用Builder Pattern下，用户如何创建各种形式的车
     * 缺点：
     *    1、每次用户要一种体验时，都要重新创建一个sequence；
     *    2、需要用户明确指出具体的功能名字，若功能名字写错了就不行；
     */
    private static void client1(){
        // 体验宝马车
        // 由用户指定要选择体验的项目
        List<String> sequence = new ArrayList<>();
        sequence.add("start");
        sequence.add("alarm");
        sequence.add("stop");
        BWMCar bwmCar = new BWMCar();
        bwmCar.setSequence(sequence);
        // 开始运行车辆
        bwmCar.run();


        // 体验奔驰车辆
        List<String> sequence2 = new ArrayList<>();
        sequence2.add("start");
        sequence2.add("engineBoom");
        sequence2.add("stop");
        BenzCar benzCar = new BenzCar();
        benzCar.setSequence(sequence2);
        benzCar.run();
    }

    /**
     * 对场景一的改进：
     *      1、 对用户隐藏了具体项目的参数，用户只需要选择自己需要的项目即可；
     *      2、用户需要那种项目集合，通过Builder类型进行配置即可。
     */
    private static void client2(){
        // 体验宝马车的 启动、喇叭、停止项目
        BWMCarBuilder bwmCarBuilder = new BWMCarBuilder();
        CarModel bwmCar = bwmCarBuilder.withStart()
                .withAlarm()
                .withStop()
                .build();
        bwmCar.run();
        // 体验宝马的 启动、发动引擎、按喇叭、停止项目
        BWMCarBuilder bwmCarBuilder1 = new BWMCarBuilder();
        CarModel bwmCar1 = bwmCarBuilder1.withStart()
                .withEngineBoom()
                .withAlarm()
                .withStop()
                .build();
        bwmCar1.run();

        // 体验奔驰的启动、发动引擎、停止项目
        BenzCarBuilder benzCarBuilder = new BenzCarBuilder();
        CarModel benzCar = benzCarBuilder.withStart()
                .withEngineBoom()
                .withStop()
                .build();
        benzCar.run();
        // 体验奔驰的停止、启动、喇叭、发动引擎项目
        BenzCarBuilder benzCarBuilder1 = new BenzCarBuilder();
        CarModel benzCar1 = benzCarBuilder1.withStop()
                .withStart()
                .withAlarm()
                .withEngineBoom()
                .build();
        benzCar1.run();
    }
}
